package netty.test1Base;

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Arrays;

/**
 * 用serverSockerChannel 演示 nio scatter 和gatter
 *
 * 启动服务后执行 dos
 * 1，telnet 127.0.0.1 7000
 * 2, ctrl+]
 * 3，send abc
 */
public class ScatterAndGaterServer {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel server= ServerSocketChannel.open();
        InetSocketAddress address= new InetSocketAddress(7000);
        server.socket().bind(address);
        //创建buf数组
        ByteBuffer [] buffers=new ByteBuffer[2];
        buffers[0]=ByteBuffer.allocate(5);
        buffers[1]=ByteBuffer.allocate(3);
        //等待客户端连接(这里没有用selector器，相当于单一个客户端只能给一个用户服务（单线程）)
        SocketChannel socket=server.accept();
        //这里假定从客户端接收8 个字节（上门数组设置的是8）
        int messageLen=8;
        while(true){
            int byteRead=0;
            while(byteRead <messageLen){
                //读到buffers数组中，第一个读满后，会自动读到第二个buffer中
                long count=socket.read(buffers);
                //累计读取的字节数
                byteRead+=count;
                System.out.println("has read count="+byteRead);
                //输出（使用流打印），查看当前的buffer 的limit 和position
                /*Arrays.asList().stream().map(buffer->"postion="+buffer.position()
                +", limit="+buffer.limit()).forEach(System.out::println);*/
                for(ByteBuffer buf:buffers){
                    System.out.println("postion="+buf.position()+",limit="+buf.limit());
                }
            }
            //要做其他的操作的时候，这里还要将所有的buffer 进行反转操作
            buffers[0].flip();
            buffers[1].flip();

            //可以将数据再显示给客户端
            int byteWrite=0;
            //这里改变下第一个字符，再会送给客户端
            buffers[0].put(0,(byte)'c');
            while (byteWrite <messageLen){
                long count2=socket.write(buffers);
                byteWrite +=count2;
            }

            //将所有的 buffer 复位
            buffers[0].clear();
            buffers[1].clear();

            System.out.println("byteRead ="+byteRead + "   byteWrite="+byteWrite);
        }



    }
}
